/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package MIPS;

import java.util.concurrent.Semaphore;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Keiner - jorgue
 */
public class EtapaWB extends Etapa {

    private int[] juegoRegistros;
    private int PC = -1;
    private int RA;
    private int RB;
    private int RL;
    private int AluOutPut;
    private int[] IR;
    private boolean sigo = true;  //bandera para detener en caso de cambio de contexto
    private int PCListo = -2;      //Control para saber si hubo fallo anteriormente
    private boolean escribir = true; //Indica si se debe entrar a escribir registros o no

    EtapaWB(pizarra pizarraI, pizarra pizarraD, Semaphore semaphore, Semaphore principal, int[] registros) {
        super(4, pizarraI, pizarraD, semaphore, principal);
        juegoRegistros = registros;
    }

    public void setRegistros(int[] registros) {
        System.arraycopy(registros, 0, juegoRegistros, 0, registros.length);
    }

    public int[] getJuegoRegistros() {
        return juegoRegistros;
    }
    
    public void setPCListo(int PC){
        PCListo = PC;
    }

    @Override
    public void run() {
        while (true) {
            try {
                organizador.acquire();
                if (izquierda != null) {
                    synchronized (izquierda) {
                        izquierda.lock();
                        if (sigo) {
                            PC = izquierda.getPC();
                            if (PCListo != PC) {
                                PCListo = PC;
                                escribir = true;
                                IR = izquierda.getIR();
                                RA = izquierda.getRA();
                                RB = izquierda.getRB();
                                RL = izquierda.getRL();
                                AluOutPut = izquierda.getALU();

                            } else {
                                escribir = false;
                            }
                        }
                        cambio = izquierda.getCambio();

                        izquierda.setCopiado(true);
                        izquierda.unLock();

                    }
                }
                if (IR != null && sigo && escribir) {
                    if(IR[0] == 8 || IR[0] == 35 || IR[0] == 11 ||IR[0] == 22){         
                        juegoRegistros[IR[2]] = AluOutPut;
                        System.out.println("Salvando en registro: " + IR[2]);
                    }else{
                        if(IR[0] == 32 || IR[0] == 34 || IR[0] == 12 || IR[0] == 14){
                            juegoRegistros[IR[3]] = AluOutPut;
                            System.out.println("Salvando en registro: " + IR[3]);
                        } //Else no hce nada.
                    }
                    juegoRegistros[31] = RL;
                    
                }
                if (cambio) {
                    sigo = false;
                } else {
                    sigo = true;
                }
                principal.release();
                //    System.out.println("Saludos desde: " + quienSoy);
            } catch (InterruptedException ex) {
                Logger.getLogger(Etapa.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
